/******************************************************************************\
 *                                                                              *
 *     File: Dierentuin_test.cpp                                                *
 *                                                                              *
 *   Author: Douwe A. van Twillert                                              *
 *  Purpose: test van de klasse Dierentuin                                      *
 *  Version: 1.0      TWI 20080218                                              *
 *           - Initial version                                                  *
 *                                                                              *
\******************************************************************************/

#include <string>

#include "TestSet.hpp"

#include "Dierentuin.h"


TEST_SET(DierentuinTesten);


TEST(DierentuinConstructorTestGood1)
        Dierentuin* artis = new Dierentuin("Artis");

        CHECK(artis != 0);

        delete artis;
END_TEST


TEST(DierentuinConstructorTestFailure2)
        Dierentuin* artis = new Dierentuin("");

        delete artis;
END_TEST


TEST(DierentuinConstructorTest4)
        Dierentuin* dierentuin = new Dierentuin("this is a very long name "
                "but that stil must be no problem"
                "no matter how long is should become"
                );

        CHECK(dierentuin != 0);

        delete dierentuin; // delete 0 is defined as no harm done
END_TEST


TEST(DierentuinGetName1)
        Dierentuin* dierentuin = new Dierentuin("x");

        CHECK(dierentuin != 0);

        string naam = dierentuin->getNaam();
        string lege_naam = "";

        CHECK(naam.compare(lege_naam) != 0);

        delete dierentuin; // delete 0 is defined as no harm done
END_TEST



TEST_SET(DierentuinMethodsTests)


TEST(DierentuinGetNameTestGood1)
        const char* name = "a name";
        Dierentuin* dierentuin = new Dierentuin(name);
        string a_name = "";

        CHECK(dierentuin != 0);
        a_name = dierentuin->getNaam();
        CHECK(a_name.compare(name) == 0);

        delete dierentuin;
END_TEST


TEST(DierentuinGetNameTestGood2)
        const char* name = "this is a very long name "
        "but that stil must be no problem"
        "no matter how long is should become";

        Dierentuin* dierentuin = new Dierentuin(name);

        CHECK(dierentuin != 0);
        CHECK(dierentuin->getNaam() == name);
        CHECK(dierentuin->getNaam().compare(name) == 0);

        delete dierentuin;
END_TEST

TEST(DierentuinGetLaagsteBeschikbareNummerGood1)
        int nr;
        string optie = "dier";

        Dierentuin* dierentuin = new Dierentuin("Test");
        nr = dierentuin->getLaagsteBeschikbareNummer(optie);

        CHECK(nr != -1);

        delete dierentuin;

END_TEST

TEST(DierentuinGetLaagsteBeschikbareNummerGood2)
        int nr;
        string optie = "werknemer";

        Dierentuin* dierentuin = new Dierentuin("Test");
        nr = dierentuin->getLaagsteBeschikbareNummer(optie);

        CHECK(nr != -1);

        delete dierentuin;

END_TEST

TEST(DierentuinGetLaagsteBeschikbareNummerFail1)

        int nr;
        string optie = "blabla";

        Dierentuin* dierentuin = new Dierentuin("Test");
        nr = dierentuin->getLaagsteBeschikbareNummer(optie);

        CHECK(nr == -1);

        delete dierentuin;

END_TEST
                
TEST(DierentuinGetLaagsteBeschikbareNummerFail2)

        int nr;
        string optie = "";

        Dierentuin* dierentuin = new Dierentuin("Test");
        nr = dierentuin->getLaagsteBeschikbareNummer(optie);

        CHECK(nr == -1);

        delete dierentuin;

END_TEST
                
TEST(DierentuinWerknemerToevoegenGood1)
        string naam = "Henk";
        int leeftijd = 54;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->werknemerToevoegen(naam, leeftijd);
        CHECK (dierentuin->getWerknemer(1) != 0 );
        
        delete dierentuin;
END_TEST
                
TEST(DierentuinWerknemerToevoegenGood2)
        string naam = "Barry";
        int leeftijd = 16;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->werknemerToevoegen(naam, leeftijd);
        CHECK (dierentuin->getWerknemer(1) != 0 );
        
        delete dierentuin;
END_TEST
                
TEST(DierentuinWerknemerToevoegenFail1)
        string naam = "Barry";
        int leeftijd = 15;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        EXPECT_SYSTEM_ASSERTION_FAILED;
        dierentuin->werknemerToevoegen(naam, leeftijd);
        EXPECT_NOT_REACHED;
        
        
        delete dierentuin;
END_TEST
                
TEST(DierentuinWerknemerToevoegenFail2)
        string naam = "";
        int leeftijd = -1;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        EXPECT_SYSTEM_ASSERTION_FAILED;
        dierentuin->werknemerToevoegen(naam, leeftijd);
        EXPECT_NOT_REACHED;
        
        
        delete dierentuin;
END_TEST
                
TEST(DierentuinDierToevoegenGood1)
        string naam = "varken";
        int leeftijd = 3;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->dierToevoegen(naam, leeftijd);
        CHECK (dierentuin->getDier(1) != 0 );
        
        delete dierentuin;
END_TEST
                
TEST(DierentuinDierToevoegenGood2)
        string naam = "Koe";
        int leeftijd = 24;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->dierToevoegen(naam, leeftijd);
        CHECK (dierentuin->getDier(1) != 0 );
        
        delete dierentuin;
END_TEST
                                
TEST(DierentuinDierToevoegenFail)
        string naam = "Paard";
        int leeftijd = -1;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        EXPECT_SYSTEM_ASSERTION_FAILED;
        dierentuin->dierToevoegen(naam, leeftijd);
        EXPECT_NOT_REACHED;
        
        
        delete dierentuin;
END_TEST 
                
TEST(DierentuinDierVerwijderenGood)
        string naam = "Koe";
        int leeftijd = 24;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->dierToevoegen(naam, leeftijd);
        CHECK (dierentuin->getDier(1) != 0 );
        
        dierentuin->dierVerwijderen(1);
        
        CHECK (dierentuin->getDier(1) == 0);
        
        delete dierentuin;
END_TEST
                
TEST(DierentuinDierVerwijderenFail)
        string naam = "Paard";
        int leeftijd = 3;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->dierToevoegen(naam, leeftijd);
        CHECK (dierentuin->getDier(1) != 0 );
        
        EXPECT_SYSTEM_ASSERTION_FAILED;
        dierentuin->dierVerwijderen(0);
        EXPECT_NOT_REACHED;
        
        
        delete dierentuin;
END_TEST 
                
TEST(DierentuinWerknemerVerwijderenGood)
        string naam = "Henk";
        int leeftijd = 54;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->werknemerToevoegen(naam, leeftijd);
        CHECK (dierentuin->getWerknemer(1) != 0 );
        
        dierentuin->werknemerVerwijderen(1);
        
        CHECK (dierentuin->getWerknemer(1) == 0);
        
        delete dierentuin;
END_TEST
            
TEST(DierentuinWerknemerVerwijderenFail)
        string naam = "Henk";
        int leeftijd = 54;
        Dierentuin* dierentuin = new Dierentuin("Test");
        
        dierentuin->werknemerToevoegen(naam, leeftijd);
        CHECK (dierentuin->getWerknemer(1) != 0 );
        
        EXPECT_SYSTEM_ASSERTION_FAILED;
        dierentuin->werknemerVerwijderen(0);
        EXPECT_NOT_REACHED;
        
        
        delete dierentuin;
END_TEST 

int main() {
    return TestSet_execute();
}
